Uvod

Skrepanje i uređivanje podataka

library(rvest)
library(dplyr)
library(rgdal)
library(ggplot2)
library(sf)
library(stringr) 
library(lubridate)
library(readr)
library(tm)
library(wordcloud)
library(cowplot)
library(stargazer)
library(knitr)
#ode ide inace skrep ali sad samo vadimo csv
podaci = read_csv("/Users/perica/Desktop/PODACI.csv")
kable(podaci[1:5,])
…1 lokacija naslov cijena kvadratura objekt sobe opis kvadrat datumi županija
1 Bakar Stan Bakar 1S+DB - 66m2, stan s terasom i potkrovljem 100000 66.00 U stambenoj zgradi 1s-1s+DB Prodaje se stan u Bakru površine 66 m2.Stan se nalazi na prvom katu, sastoji se od kuhinje, kupaonice, dnevnog boravka, spavaće sobe,terase i potkrovlja.Terasa je zbog svoje prostranosti i orijentacije (izolirana od pogleda s ulice a otvorena pogledom prema zelenim površinama), dobra strana ovog stana. Stan zahtijeva renovaciju. Velika prednost ove nekretnine je mnoštvo mogućnosti prenamjene postojećeg rasporeda i proširenje na pripadajuće potkrovlje čime bi se dobila veća kvadratura stambene površine.Stan s mnogo potencijala.Poštovani klijenti, agencijska provizija naplaćuje se u skladu s Općim uvjetima poslovanjawww.dux-nekretnine.hr/opci-uvjeti-poslovanjaID KOD AGENCIJE: 963Tomislav TomišaAgent s licencomMob: +385 95 199 2696Tel: +385 51 518 174E-mail: [email protected]www.dux-nekretnine.hr 1515.15 2022-11-14 Primorsko-goranska
2 Bakar Bakar, 90m2, 4-sobni stan s db na samoj rivi 156000 90.00 U stambenoj zgradi 3s-3s+DB U centru Bakra na samoj rivi smještena je ova nekretnina od 90m2 s pogledom na more. Sastoji se od kuhinje s blagovaonicom, dnevnog boravka, tri veće i jedne manje sobe, hodnika, kupaonice te pripadajućeg tavanskog prostora od 75m2 s mogućnošću uređenja u dodatnu manju stambenu jedinicu i dodatnog pomoćnog toaleta. ID KOD AGENCIJE: 23840Željko KalinčevićDirektorMob: +385 91 205 0962Tel: 051 322 376Fax: 051 311 059E-mail: [email protected]http://millennium-nekretnine.hr 1733.33 2022-11-14 Primorsko-goranska
3 Bakar RIJEKA, HRELJIN - Jednosobni s dnevnim boravkom u novogradnji,vrt/tera 104000 47.00 U stambenoj zgradi 1s-1s+DB RIJEKA, HRELJIN - Jednosobni s dnevnim boravkom u novogradnji,vrt/terasa i parkirno mjestoStan površine 47 m2 s vrtom i parkirnim mjestom, smješten u prizemlju.Moderna novogradnja s dvije etaže.Četiri stana u zgradi, uz stan parkirno mjesto.Stanovi u prizemlju imaju vrt/terasu.Zgrada izgrađena, pod krovom, trenutno u fazi roh bau.Oprema stana :-Klima-PVC stolarija s roletama na struju-podno grijanje-protuprovalna vrata-kvalitetna sobna vrata7unutarnja stolarija-keramika 1.klase/laminat (za podnio grijanje ..po odabiru)-walk in kupatilo-kvalitetne renomirane sanitarijeKljuč u ruke!Završetak radova, opremanje i uređenje krajem 2022.godine.Energetski razred AOdlične orijentacije, osunčan od izlaska do zalaska sunca, pun dnevnog svjetla i južnog pogleda jedinstvena je prilika pozicijom, uređenjem i cijenom.Izrazito mali režijski troškovi stanovanja uz veliku blizinu svih potrebnih, a bitnih sadržaja.Definitivno neponovljiva prilika!Nekretnina je smještena u samom centru mjesta te bitnih i poslovnih sadržaja.Ostali sadržaj u pješačkom krugu, škola, vrtić, doktor, dućan..Novogradnja u mirnom i tihom susjedstvu.Okružena zelenilom te manjim zgradama, smještena u slijepoj ulici na odličnoj lokaciji.Odlična prilika za investiciju ili za život te spoj posla i privatnog života!Ne propustite ovu priliku!Poštovani klijenti, agencijska provizija naplaćuje se u skladu s Općim uvjetima poslovanja : www.dux-nekretnine.hr/opci-uvjeti-poslovanjaZa ogled obratite se agentu;Tomislav TomišaLicencirani agent095 199 2 696ID KOD AGENCIJE: 15696Tomislav TomišaAgent s licencomMob: +385 95 199 2696Tel: +385 51 518 174E-mail: [email protected]www.dux-nekretnine.hr 2212.77 2022-11-14 Primorsko-goranska
4 Bakar Škrljevo, etaža kuće sa pripadajućom okućnicom od 300 m2 82000 93.00 U stambenoj zgradi 2s-2s+DB Škrljevo Etaža kuće, površine 93 m2 sa 300 m2 okućnice. Nalazi se na 1. katu . Sastoji se od dvije spavaće sobe, dnevnog boravka, kuhinje i kupaonice. Stanu pripada i tavanski prostor . Pogled na more, blizina svih sadržaja. Etaža je za uređenje.ID KOD AGENCIJE: 2752Sanda MatoševićOvlašteni posrednikMob: 098 327 619Tel: 051 504 699Fax: 051 504 691E-mail: [email protected]www.consido.hr 881.72 2022-11-14 Primorsko-goranska
5 Bakar Bakar, 2s+db s velikom terasom 125000 73.08 U stambenoj zgradi 2s-2s+DB U centru Bakra prodajemo 2s+db s velikom terasom s koje se pruža pogled na cijeli Bakarski zaljev. Stan je mansardni u visini drugog kata, kompletno adaptiran 2013. godine. Na okućnici zgrade je sojenica s roštiljem. Stanu pripada jedno parkirno mjesto. Za sve informacije nazovite 098/289-093ID KOD AGENCIJE: 17421Goran VagajaMob: 098/289-093Tel: 051/227-733www.kapitalnekretnine.hr 1710.45 2022-11-14 Primorsko-goranska
žup_cro <- data.frame(
  županija = c(
    "Virovitičko-podravska",
    "Koprivničko-križevačka",
    "Osječko-baranjska",
    "Istarska",
    "Dubrovačko-neretvanska",
    "Sisačko-moslovačka",
    "Brodsko-posavska",
    "Karlovačka",
    "Zadarska",
    "Vukovarsko-srijemska",
    "Splitsko-dalmatinska",
    "Varaždinska",
    "Krapinsko-zagorska",
    "Zagrebačka",
    "Primorsko-goranska",
    "Šibensko-kninska",
    "Ličko-senjska",
    "Bjelovarsko-bilogorska",
    "Grad Zagreb",
    "Međimurska",
    "Požeško-slavonska"
  )
)


# prosjecni kvadrat po županiji
avg_cro <- aggregate(kvadrat ~ županija, data = podaci, FUN = mean)

# stand. devijacija
sd_cro <- aggregate(kvadrat ~ županija, data = podaci, FUN = sd)

# koeficijent varijacije po županiji
cv_cro <-
  data.frame(županija = avg_cro$županija,
             cv = sd_cro$kvadrat / avg_cro$kvadrat)

# broj oglasa po županiji (da vidite broj podataka i odlucimo koliko je "znacajno" za zeleno na karti)
cnt_cro <-
  aggregate(lokacija ~ županija, data = podaci, FUN = length)

# merge u fajl koji ima podatke o svakoj županiji
cro_data <-
  merge(merge(avg_cro, cv_cro, by = "županija"), cnt_cro, by = "županija")
cro_data <-
  merge(žup_cro, cro_data, by = "županija", all.x = TRUE)
names(cro_data) <-
  c("županija", "avgKvadrata", "koefVarKvadrata", "brojOglasa")  #stupce preimenovat

#brisanje
rm(žup_cro,
   avg_cro,
   sd_cro,
   cv_cro,
   cnt_cro)

kable(cro_data)
županija avgKvadrata koefVarKvadrata brojOglasa
Bjelovarsko-bilogorska 1106.945 0.1647883 4
Brodsko-posavska 1501.212 0.3526608 40
Dubrovačko-neretvanska 3484.280 0.3857475 49
Grad Zagreb 2799.509 0.2730213 1566
Istarska 3211.686 0.3448460 2097
Karlovačka 1486.813 0.3862668 3
Koprivničko-križevačka NA NA NA
Krapinsko-zagorska 1666.701 0.2275210 8
Ličko-senjska 2951.229 0.3264797 60
Međimurska 1593.333 0.1050826 3
Osječko-baranjska 1559.107 0.3000016 11
Požeško-slavonska 2923.640 NA 1
Primorsko-goranska 2826.340 0.4700586 4584
Šibensko-kninska 2968.267 0.2733339 427
Sisačko-moslovačka 2582.590 0.0160993 2
Splitsko-dalmatinska 3153.648 0.3161823 251
Varaždinska 1948.274 0.2116252 18
Virovitičko-podravska NA NA NA
Vukovarsko-srijemska 2899.750 NA 1
Zadarska 3230.030 0.3514062 557
Zagrebačka 2220.450 0.2394800 109

Vizualizacija podataka

PITA

# županije sortirane silazno po broju oglasa
cro_data_sorted <- cro_data[order(-cro_data$brojOglasa),]

# Create a new data frame with the top x županija and their corresponding 'brojOglasa' values
x <- 5
top_x_zupanija <- data.frame(županija = cro_data_sorted$županija[1:x], 
                             brojOglasa = cro_data_sorted$brojOglasa[1:x])

# Calculate the total number of 'brojOglasa' for the remaining županija
ostali_brojOglasa <- sum(cro_data_sorted$brojOglasa[x:length(cro_data_sorted$brojOglasa)], na.rm = TRUE)

# Create a new row for the remaining županija with a label 'ostali'
ostali_zupanija <- data.frame(županija = "Ostali", brojOglasa = ostali_brojOglasa)

#skupa
top_x_ostali <- rbind(top_x_zupanija, ostali_zupanija)

PITA

piepercent <- round(100*top_x_ostali$brojOglasa/sum(top_x_ostali$brojOglasa), 1)
piepercent[length(piepercent)] <- round(100 - sum(piepercent[-length(piepercent)]), 1)

pie(piepercent,
    labels = paste(top_x_ostali$županija, paste0(piepercent, "%")),
    main = "PITA KRUMPIRUŠA", 
    col = rainbow(length(top_x_ostali$brojOglasa)))

rm(ostali_brojOglasa, ostali_zupanija, x, piepercent)

VIOLINICE

# Create a vector of all županija names
all_zupanije <- unique(cro_data_sorted$županija)

# Get the names of the županije not in top_x_županija
ostale_zupanije <- setdiff(all_zupanije, top_x_zupanija$županija)


# Replace the names of the županije not in top_x_županija with 'Ostali'
podaci_renamed <-
  within(podaci, županija[županija %in% ostale_zupanije] <-
           'Ostali')

# Convert županija variable to a factor with the desired order
podaci_renamed$županija <-
  factor(podaci_renamed$županija, levels = top_x_ostali$županija)

VIOLINICE

# Create the violin plot
ggplot(data = podaci_renamed, aes(x = županija, y = kvadrat, color = županija)) +
  geom_violin() +
  labs(title = "Violinice",
       x = "Županija",
       y = "Kvadrat") +
  geom_boxplot(width = 0.1) +
  guides(color = FALSE)

rm(cro_data_sorted, all_zupanije, ostale_zupanije, podaci_renamed, top_x_ostali, top_x_zupanija)

KARTA I PODACI (CRO)

# karta
cro_map <-
  readOGR("/Users/perica/Desktop/matina_sranja", "Croatia_map")

# spajanje tih podataka s kartom u zajednicki fajl
cro_data_map <-
  merge(
    cro_map,
    cro_data,
    by.x = "County",
    by.y = "županija",
    all.x = TRUE
  )
cro_data_map <- st_as_sf(cro_data_map)       #bolji format

#brisanje
rm(cro_map)

PLOTIRANJE (CRO)

# avg cijena po kv CRO
ggplot(cro_data_map) +
  geom_sf(aes(fill = round(avgKvadrata, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#efedf5",
    high = "#3f007d",
    #raspon boja županija, opcionalno za boju onih bez podataka ide: na.value = "boja"
    breaks = c(1000, 1650, 2250, 2850, 3500),
    limits = c(1000, 3500)
  ) +
  theme_void() +       #tema da nema rešetki priko karte
  labs(title = "Prosječna cijena po kvadratu u Hrvatskoj",
       fill = "Cijena po metru kvadratnom (€)",
       caption = "Zelene županije - značajna količina podataka\nCrne županije - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(avgKvadrata) |
        is.null(avgKvadrata),
      County,
      paste0(County, "\n", "€", sprintf("%.2f", round(avgKvadrata, 2)))
    )),
    #ako nema podataka, onda samo ime županije
    size = 2.5,
    #za tekst županija je sve dalje
    fontface = "bold",
    color = ifelse(
      cro_data_map$brojOglasa < 40 |
        is.na(cro_data_map$brojOglasa) |
        is.null(cro_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    #zeleni imaju znacajno podataka, crni ne
    fill = "#F2F3F4",
    label.padding = unit(0.15, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0.001
  )

# koef var CRO
ggplot(cro_data_map) +
  geom_sf(aes(fill = round(koefVarKvadrata * 100, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#deebf7",
    high = "#08306b",
    breaks = c(0, 10, 20, 30, 40, 50),
    limits = c(0, 50)
  ) +
  theme_void() +
  labs(title = "Koeficijent varijacije cijene kvadrata u Hrvatskoj",
       fill = "Koeficijent varijacije (%)",
       caption = "Zelene županije - značajna količina podataka\nCrne županije - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(koefVarKvadrata) |
        is.null(koefVarKvadrata) ,
      County,
      paste0(County, "\n", sprintf("%.2f", round(koefVarKvadrata, 2) * 100), "%")
    )),
    size = 2.5,
    fontface = "bold",
    color = ifelse(
      cro_data_map$brojOglasa < 40 |
        is.na(cro_data_map$brojOglasa) |
        is.null(cro_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    fill = "#F2F3F4",
    label.padding = unit(0.15, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0.001
  )

rm(cro_data_map)

KARTA I PODACI (ZG)

kvart_zg <-
  data.frame(
    lokacija = c(
      "Brezovica",
      "Črnomerec",
      "Donja Dubrava",
      "Donji Grad",
      "Gornja Dubrava",
      "Gornji Grad - Medveščak",
      "Maksimir",
      "Novi Zagreb - Istok",
      "Novi Zagreb - Zapad",
      "Pešćenica - Žitnjak",
      "Podsljeme",
      "Podsused - Vrapče",
      "Sesvete",
      "Stenjevec",
      "Trešnjevka - Jug",
      "Trešnjevka - Sjever",
      "Trnje",
      "Zagreb - Okolica"
    )
  )

# izdvojimo kvartove
zg_data <-
  subset(podaci,
         županija == "Grad Zagreb",
         select = c("lokacija", "kvadrat"))

# prosjecni kvadrat po kvartovima zga
avg_zg <- aggregate(kvadrat ~ lokacija, data = zg_data, FUN = mean)

# stand. devijacija
sd_zg <- aggregate(kvadrat ~ lokacija, data = zg_data, FUN = sd)

# koeficijent varijacije po kvartovima zga
cv_zg <-
  data.frame(lokacija = avg_zg$lokacija,
             cv = sd_zg$kvadrat / avg_zg$kvadrat)

# broj oglasa po kvartovima zga (da vidite broj podataka i odlucimo koliko je "znacajno" za zeleno na karti)
cnt_zg <-
  aggregate(kvadrat ~ lokacija, data = zg_data, FUN = length)

# merge u fajl koji ima podatke o svakoj županiji
zg_data <-
  merge(merge(avg_zg, cv_zg, by = "lokacija"), cnt_zg, by = "lokacija")
zg_data <-
  merge(kvart_zg, zg_data, by = "lokacija", all.x = TRUE)
names(zg_data) <-
  c("lokacija", "avgKvadrata", "koefVarKvadrata", "brojOglasa")  #stupce preimenovat

# karta
zg_map <-
  readOGR("/Users/perica/Desktop/matina_sranja", "Zagreb_map")

# spajanje tih podataka s kartom u zajednicki fajl
zg_data_map <-
  merge(zg_map,
        zg_data,
        by.x = "District",
        by.y = "lokacija",
        all.x = TRUE)
zg_data_map <- st_as_sf(zg_data_map)       #pogodniji format


#brisanje
rm(zg_data,
   kvart_zg,
   avg_zg,
   sd_zg,
   cv_zg,
   cnt_zg,
   zg_map)

PLOTIRANJE (ZG)

# avg cijena po kv ZG
ggplot(zg_data_map) +
  geom_sf(aes(fill = round(avgKvadrata, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#fcfbfd",
    high = "#3f007d",
    #raspon boja kvartova
    breaks = c(2000, 2500, 3000, 3500),
    limits = c(2000, 3500)
  ) +
  theme_void() +       #tema da nema rešetki priko karte
  labs(title = "Prosječna cijena po kvadratu u Zagrebu",
       fill = "Cijena po metru kvadratnom (€)",
       caption = "Zeleni kvartovi - značajna količina podataka\nCrni kvartovi - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(avgKvadrata) |
        is.null(avgKvadrata),
      District,
      paste0(District, "\n", "€", sprintf("%.2f", round(avgKvadrata, 2)))
    )),
    #ako nema podataka, onda samo ime županije
    size = 2.5,
    #za tekst kvartova je sve dalje
    fontface = "bold",
    color = ifelse(
      zg_data_map$brojOglasa < 80 |
        is.na(zg_data_map$brojOglasa) |
        is.null(zg_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    #zeleni imaju znacajno podataka, crni ne
    fill = "#F2F3F4",
    label.padding = unit(0.15, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0.001
  )

# koef var ZG
ggplot(zg_data_map) +
  geom_sf(aes(fill = round(koefVarKvadrata * 100, 2)),
          color = "gray",
          lwd = 1) +
  scale_fill_gradient(
    low = "#deebf7",
    high = "#08306b",
    breaks = c(0, 10, 20, 30, 40),
    limits = c(0, 40)
  ) +
  theme_void() +
  labs(title = "Koeficijent varijacije cijene kvadrata u Zagrebu",
       fill = "Koeficijent varijacije (%)",
       caption = "Zeleni kvartovi - značajna količina podataka\nCrni kvartovi - manja količina podataka") +
  geom_sf_label(
    aes(label = ifelse(
      is.na(koefVarKvadrata) |
        is.null(koefVarKvadrata),
      District,
      paste0(District, "\n", sprintf("%.2f", round(koefVarKvadrata, 2) * 100), "%")
    )),
    size = 2.5,
    fontface = "bold",
    color = ifelse(
      zg_data_map$brojOglasa < 80 |
        is.na(zg_data_map$brojOglasa) |
        is.null(zg_data_map$brojOglasa),
      "black",
      "darkgreen"
    ),
    fill = "#F2F3F4",
    label.padding = unit(0.15, "lines"),
    label.r = unit(0.2, "lines"),
    label.size = 0.001
  )

rm(zg_data_map,cro_data)

Statistika

REGRESIJA

### graf cijenje i kvadrature svih oglasa (kontrolni graf) ###
p3<-ggplot(podaci, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="deepskyblue3")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  coord_cartesian(ylim = c(20000, 250000),
                  xlim = c(15,120), expand = FALSE) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p3 #prokaz grafa

model <- lm(cijena ~ kvadratura, data = podaci) #definiram regresiju
summary(model) #prokaz koeficjenata
## 
## Call:
## lm(formula = cijena ~ kvadratura, data = podaci)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1119718   -59443   -15168    33382  1713609 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5241.66    3101.92    1.69   0.0911 .  
## kvadratura   2856.40      32.86   86.92   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 131500 on 9789 degrees of freedom
## Multiple R-squared:  0.4356, Adjusted R-squared:  0.4356 
## F-statistic:  7556 on 1 and 9789 DF,  p-value: < 2.2e-16
rm(model,p3) #brisanje varijabli

INDEXI

B=1 #B je koji ces bazni index da ti bude

#definiram vektore za spremanje
cjene = c()
velicina = c()
mjesec = c()

#za cjene iz 2022
filter=subset(podaci, year(podaci$datumi)==2022)
for(i in 4:12){
  mjesec = append(mjesec,paste(as.numeric(i),"/","2022",sep="",collapse=NULL))
  filter2=subset(filter,month(filter$datumi)==i)
  velicina=append(velicina,length(filter2$kvadrat))
  cjene = append(cjene,mean(filter2$kvadrat))
}
# za cjene iz 2023
filter=subset(podaci, year(podaci$datumi)==2023)
for(i in 1:3){
  mjesec = append(mjesec,paste(as.numeric(i),"/","2023",sep="",collapse=NULL))
  filter2=subset(filter,month(filter$datumi)==i)
  velicina=append(velicina,length(filter2$kvadrat))
  cjene = append(cjene,mean(filter2$kvadrat))
}

#racunam indekse
cjeneB=(cjene/cjene[B])*100

#kreiram tablicu
tablica=data.frame(cjene,cjeneB,velicina,mjesec)
Q=tablica #za tablicu

#samo misece probacijen u tip datuma
tablica$mjesec <- as.Date(paste0("01/", tablica$mjesec), format = "%d/%m/%Y")

# Prikaz indexa (komentirat s deckima ocemo maknit ili ostavit ovu mracnu liniju)
index <- ggplot(tablica, aes(x=mjesec, y=cjene)) +
  geom_line(size = 1.5, color = "red") + 
  geom_point(color = "black") + 
  geom_smooth(method = "lm", se = TRUE, level=0.95)+
  scale_y_continuous(breaks = seq(2800,3500,100)) +
  scale_x_date(date_breaks = "2 months") +
  ylab("Cijena kvadrata u €") +
  xlab("") + 
  ggtitle("Cijene stanova dataseta po datumu") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
theme_linedraw()
index #prikaz grfa

#koef korelacije
paste("Koeficjent koorelacije je:",as.character(cor(cjene,c(1:12))))
## [1] "Koeficjent koorelacije je: 0.801755608917857"
#moja regresija
model <- lm(cjene ~ c(1:12), data = tablica)
summary(model)
## 
## Call:
## lm(formula = cjene ~ c(1:12), data = tablica)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -170.760  -40.418   -7.156   14.160  212.524 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2734.295     62.591  43.685 9.49e-13 ***
## c(1:12)       36.077      8.504   4.242  0.00171 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 101.7 on 10 degrees of freedom
## Multiple R-squared:  0.6428, Adjusted R-squared:  0.6071 
## F-statistic:    18 on 1 and 10 DF,  p-value: 0.00171
Q #prikaz tablice
##       cjene    cjeneB velicina  mjesec
## 1  2891.322 100.00000       29  4/2022
## 2  2811.406  97.23600      102  5/2022
## 3  2842.811  98.32218       81  6/2022
## 4  2860.103  98.92024       63  7/2022
## 5  2954.888 102.19848       49  8/2022
## 6  2920.485 101.00863     1732  9/2022
## 7  2816.078  97.39756      453 10/2022
## 8  2952.067 102.10091     4466 11/2022
## 9  3044.397 105.29429      968 12/2022
## 10 3015.653 104.30013     1267  1/2023
## 11 3136.625 108.48411       92  2/2023
## 12 3379.749 116.89286       17  3/2023
#rjesavanje varijabli
rm(B,cjeneB,cjene,i,mjesec,velicina,filter,filter2,index,model,tablica,Q)

##RIJEČI

###analiza broja rici

# Stvaranje novog stupca gdje ce pisati broj rijeci u oglasu za svaki opis
podaci$br_rijeci = NA 
opis=podaci$opis
for (x in 1:length(podaci$naslov)) {
  my_string <- opis[x]
  podaci$br_rijeci[x] <- length(strsplit(as.character(my_string), "\\w+")[[1]])
}
rm(x,my_string)

# Filtriranje podatka
filtrirani_podaci <- podaci %>%
  filter(br_rijeci >=50 & br_rijeci <=600, kvadrat >=1000 & kvadrat <= 8000)

# Prikaz korelacije 
p1<-ggplot(filtrirani_podaci, aes(y = kvadrat, x = br_rijeci )) + 
  geom_point(shape=18, color="deepskyblue3")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  ylab("Cijena po m2") +
  xlab("Broj riječi u oglasu") +
  ggtitle("Utjecaj broja riječi na cijenu kvadrata stana") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p1

rm(p1)

# Linearna regresija za analizu
summary(lm(kvadrat~ br_rijeci, filtrirani_podaci))
## 
## Call:
## lm(formula = kvadrat ~ br_rijeci, data = filtrirani_podaci)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2637.4  -741.2  -192.0   502.0  5168.6 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2523.9676    22.4510  112.42   <2e-16 ***
## br_rijeci      2.5116     0.1151   21.82   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1075 on 9151 degrees of freedom
## Multiple R-squared:  0.04945,    Adjusted R-squared:  0.04934 
## F-statistic:   476 on 1 and 9151 DF,  p-value: < 2.2e-16
rm(filtrirani_podaci)
cor.test(podaci$br_rijeci, podaci$kvadrat, alternative = "greater")
## 
##  Pearson's product-moment correlation
## 
## data:  podaci$br_rijeci and podaci$kvadrat
## t = 23.044, df = 9789, p-value < 2.2e-16
## alternative hypothesis: true correlation is greater than 0
## 95 percent confidence interval:
##  0.2110071 1.0000000
## sample estimates:
##       cor 
## 0.2268355

Analiza odredenih rijeci

####### trazenje najfrekventnijih rijeci #######

#Novi vektor gdje ce se nalaziti sve rijeci iz svih opisa
v = character() 
for (y in 1:length(podaci$naslov)) {
  a=strsplit(str_squish(gsub("[^[:alpha:]]"," ",opis[y]))," ")
  v=c(v,a)
}
rm(y,a)

# Stvaranje Corpusa
text_podaci<-Corpus(VectorSource(v)) 
rm(v)

# Čišćenje Corpusa
text_1<-tm_map(text_podaci, removeNumbers)
text_1<-tm_map(text_podaci, removePunctuation)
rm(text_podaci)

# Stvaranje matrice za analizu
dtm<- TermDocumentMatrix(text_1)
m<-as.matrix(dtm)
k<-sort(rowSums(m), decreasing = TRUE)
word_freq <- data.frame(word = names(k), frequency = k)
kable(word_freq[1:25,])
word frequency
stan stan 22352
email email 11163
protected protected 11074
kod kod 9771
mail mail 9308
www www 9013
nalazi nalazi 8942
sobe sobe 8940
agencije agencije 8798
tel tel 8130
sastoji sastoji 8124
nekretnine nekretnine 7680
spavaće spavaće 7037
zgrade zgrade 6386
površine površine 6347
ima ima 6233
dnevnog dnevnog 5864
boravka boravka 5682
katu katu 5361
dvije dvije 5336
stana stana 5139
kuhinje kuhinje 5112
kupaonice kupaonice 5111
dux dux 4409
grijanje grijanje 4356
rm(dtm,m,k,text_1)

Stvaranje stupaca gdje za svaki oglas stoji 1 ako sadrzi odabranu rijec, a 0 ako ne sadrzi

#stavranje stupaca
podaci$more = NA
podaci$parkirno = NA
podaci$prizemlje = NA
podaci$terasa = NA

#stvaranje vektora gdje 
da_more = vector()
ne_more = vector()
da_parking = vector()
ne_parking = vector()
da_prizemlje = vector()
ne_prizemlje = vector()
da_terasa = vector()
ne_terasa = vector()

for (i in 1:length(podaci$naslov)) {
  string_opis = opis[i]
  string_opis = tolower(string_opis)
  
  if (grepl("\\bmor[[:alpha:]]\\b",string_opis)) {
    podaci$more[i] = 1
    da_more=c(da_more,podaci$kvadrat[i])
  } else {
    podaci$more[i] = 0
    ne_more=c(ne_more,podaci$kvadrat[i])
  }
  
  if (grepl("\\bparkir[[:alpha:]]*\\b",string_opis)) {
    podaci$parkirno[i] = 1
    da_parking=c(da_parking,podaci$kvadrat[i])
  } else {
    podaci$parkirno[i] = 0
    ne_parking=c(ne_parking,podaci$kvadrat[i])
  }
  
  if (grepl("\\bprizem[[:alpha:]]*\\b",string_opis)) {
    podaci$prizemlje[i] = 1
    da_prizemlje=c(da_prizemlje,podaci$kvadrat[i])
  } else {
    podaci$prizemlje[i] = 0
    ne_prizemlje=c(ne_prizemlje,podaci$kvadrat[i])
  }
  
  if (grepl("\\bteras[[:alpha:]]*\\b",string_opis)) {
    podaci$terasa[i] = 1
    da_terasa=c(da_terasa,podaci$kvadrat[i])
  } else {
    podaci$terasa[i] = 0
    ne_terasa=c(ne_terasa,podaci$kvadrat[i])
  }
}
rm(i,string_opis,opis)

###Filtriranje data seta

df.1 <- podaci  %>%
  filter(cijena >=20000 & cijena <=250000, kvadratura >=20 & kvadratura <= 120) %>% 
  mutate(more_1 = case_when(more == "1" ~ "Stan je blizu mora",
                            more == "0" ~ "Stan nije blizu mora")) %>% 
  mutate(prizemlje_1 = case_when(prizemlje == "1" ~ "Stan je u prizemlju",
                                 prizemlje == "0" ~ "Stan nije u prizemlju")) %>% 
  mutate(parkirno_1 = case_when(parkirno == "1" ~ "Stan ima parking",
                                parkirno == "0" ~ "Stan nema parking")) %>% 
  mutate(terasa_1 = case_when(terasa == "1" ~ "Stan ima terasu",
                              terasa == "0" ~ "Stan nema terasu")) 

###Regresijski grafovi kada u opisu je rijec more i kada nije

p4<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="deepskyblue3")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  scale_x_continuous(breaks = seq(20,120,15)) +
  facet_grid(~more_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p4

rm(p4)
#test razlike sredina kod rijeci more
t.test(da_more, ne_more)
## 
##  Welch Two Sample t-test
## 
## data:  da_more and ne_more
## t = 30.98, df = 7227.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  693.1125 786.7513
## sample estimates:
## mean of x mean of y 
##  3349.306  2609.374

Regresijski grafovi kada u opisu je rijec parkirno i kada nije

p5<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="darkgreen")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  scale_x_continuous(breaks = seq(20,120,15)) +
  facet_grid(~parkirno_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p5

rm(p5)
#test razlike sredina kod rijeci parkirno
t.test(da_parking, ne_parking)
## 
##  Welch Two Sample t-test
## 
## data:  da_parking and ne_parking
## t = 17.153, df = 9761.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  355.9803 447.8413
## sample estimates:
## mean of x mean of y 
##  3135.240  2733.329

Regresijski grafovi kada u opisu je rijec prizemlje i kada nije

p6<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="firebrick")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  scale_x_continuous(breaks = seq(20,120,15)) +
  facet_grid(~prizemlje_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p6

rm(p6)
#test razlike sredina kod rijeci prizemlje
t.test(da_prizemlje, ne_prizemlje)
## 
##  Welch Two Sample t-test
## 
## data:  da_prizemlje and ne_prizemlje
## t = 6.388, df = 6122.1, p-value = 1.805e-10
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  112.0474 211.2667
## sample estimates:
## mean of x mean of y 
##  3039.271  2877.614

Regresijski grafovi kada u opisu je rijec terasa i kada nije

p7<-ggplot(df.1, aes(y = cijena, x = kvadratura )) + 
  geom_point(shape=18, color="darkturquoise")+
  geom_smooth(method=lm, se=FALSE, 
              color="black") +
  scale_x_continuous(breaks = seq(20,120,15)) +
  facet_grid(~terasa_1) +
  ylab("Cijena stana") +
  xlab("Kvadratura") +
  ggtitle("Cijena po m2") +
  theme(axis.text = element_text(size = 16),
        axis.title = element_text(size = 20, face = "bold"),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0)),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        plot.title = element_text(size = 30, face = "bold", hjust = 0.5,
                                  margin = margin(t = 0, r = 0, b = 20, l = 0)),
        strip.background = element_rect(colour = "black", fill = "white"),
        strip.text = element_text(face = "bold", size = 16))
p7

rm(p7)
#test razlike sredina kod rijeci parkirno
t.test(da_terasa, ne_terasa)
## 
##  Welch Two Sample t-test
## 
## data:  da_terasa and ne_terasa
## t = 22.942, df = 7505.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  510.7113 606.1426
## sample estimates:
## mean of x mean of y 
##  3256.809  2698.382
rm(list = ls.str(mode = 'numeric'))

regresiska analiza

m3<-lm(cijena~kvadratura + more,df.1)
m4<-lm(cijena~kvadratura + prizemlje,df.1)
m5<-lm(cijena~kvadratura + terasa,df.1)
m6<-lm(cijena~kvadratura + parkirno,df.1)
stargazer(list(m3,m4,m5,m6), type = "text")
## 
## =======================================================================================
##                                                   Dependent variable:                  
##                                 -------------------------------------------------------
##                                                         cijena                         
##                                      (1)           (2)           (3)           (4)     
## ---------------------------------------------------------------------------------------
## kvadratura                      1,169.458***  1,166.349***  1,135.537***  1,147.860*** 
##                                   (23.897)      (24.296)      (23.837)      (23.525)   
##                                                                                        
## more                            16,955.440***                                          
##                                  (1,023.623)                                           
##                                                                                        
## prizemlje                                     8,719.894***                             
##                                                (1,082.961)                             
##                                                                                        
## terasa                                                      18,903.650***              
##                                                              (1,045.963)               
##                                                                                        
## parkirno                                                                  21,229.690***
##                                                                             (966.586)  
##                                                                                        
## Constant                        78,454.120*** 81,924.930*** 80,636.220*** 76,535.190***
##                                  (1,711.990)   (1,734.375)   (1,677.279)   (1,684.735) 
##                                                                                        
## ---------------------------------------------------------------------------------------
## Observations                        6,215         6,215         6,215         6,215    
## R2                                  0.298         0.274         0.303         0.320    
## Adjusted R2                         0.298         0.274         0.303         0.319    
## Residual Std. Error (df = 6212)  38,355.410    38,990.360    38,201.820    37,754.760  
## F Statistic (df = 2; 6212)      1,317.551***  1,174.651***  1,353.192***  1,459.421*** 
## =======================================================================================
## Note:                                                       *p<0.1; **p<0.05; ***p<0.01
rm(m3,m4,m5,m6,df.1)

Zaključak